package com.edu.exam.entity.quality.audit;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 审核步骤配置实体类
 *
 * <p>审核步骤配置实体用于定义审核流程中各个步骤的详细配置，包括步骤基本信息、
 * 执行规则、角色权限、超时设置等。支持步骤间的依赖关系和并行执行。</p>
 *
 * <p>核心功能：
 * - 步骤定义：定义审核步骤的基本信息和类型
 * - 顺序管理：管理步骤在流程中的执行顺序
 * - 角色配置：配置步骤执行所需的角色和权限
 * - 规则设置：设置步骤执行的业务规则和条件</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditStepConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 流程配置ID
     *
     * <p>所属审核流程配置的ID，关联audit_process_config表。
     * 用于标识步骤所属的审核流程。</p>
     */
    @Column(name = "process_id", nullable = false)
    private Long processId;

    /**
     * 步骤名称
     *
     * <p>审核步骤的名称，用于标识和显示。
     * 应该简洁明了地描述步骤的主要功能和目的。</p>
     */
    @Column(name = "step_name", nullable = false, length = 100)
    private String stepName;

    /**
     * 步骤描述
     *
     * <p>审核步骤的详细描述，说明步骤的具体要求、
     * 执行标准、注意事项等信息。</p>
     */
    @Column(name = "step_description", columnDefinition = "TEXT")
    private String stepDescription;

    /**
     * 步骤顺序
     *
     * <p>步骤在审核流程中的执行顺序，从1开始编号。
     * 用于控制步骤的执行顺序和依赖关系。</p>
     */
    @Column(name = "step_order", nullable = false)
    private Integer stepOrder;

    /**
     * 步骤类型
     *
     * <p>审核步骤的类型标识，用于区分不同类型的审核步骤。
     * 支持的类型包括：INITIAL（初审）、REVIEW（复审）、FINAL（终审）、VALIDATION（验证）等。</p>
     */
    @Column(name = "step_type", nullable = false, length = 20)
    private String stepType;

    /**
     * 步骤角色
     *
     * <p>执行此步骤所需的角色标识。
     * 用于权限控制和任务分配。</p>
     */
    @Column(name = "step_role", length = 50)
    private String stepRole;

    /**
     * 步骤规则
     *
     * <p>步骤执行的规则标识，用于条件判断和业务逻辑控制。
     * 支持多种规则类型，如审批规则、验证规则等。</p>
     */
    @Column(name = "step_rule", length = 20)
    private String stepRule;

    /**
     * 超时时间（分钟）
     *
     * <p>步骤执行的超时时间限制，单位为分钟。
     * 0表示无超时限制，超过此时间将触发超时处理。</p>
     */
    @Column(name = "timeout_minutes")
    private Integer timeoutMinutes = 0;

    /**
     * 是否必需
     *
     * <p>标识步骤是否为必需步骤。
     * true表示必须执行，false表示可选执行。</p>
     */
    @Column(name = "is_required", nullable = false)
    private Boolean isRequired = true;

    /**
     * 是否并行
     *
     * <p>标识步骤是否可以与其他步骤并行执行。
     * true表示可以并行执行，false表示串行执行。</p>
     */
    @Column(name = "is_parallel", nullable = false)
    private Boolean isParallel = false;

    /**
     * 步骤配置
     *
     * <p>JSON格式的步骤详细配置参数。
     * 包含步骤的执行参数、条件设置、输出要求等。</p>
     */
    @Column(name = "step_config", columnDefinition = "TEXT")
    private String stepConfig;

    /**
     * 条件表达式
     *
     * <p>步骤执行的条件表达式，用于动态判断是否需要执行此步骤。
     * 支持复杂的条件判断逻辑。</p>
     */
    @Column(name = "condition_expression", columnDefinition = "TEXT")
    private String conditionExpression;

    /**
     * 动作配置
     *
     * <p>JSON格式的步骤执行动作配置。
     * 包含步骤完成后的后续动作、通知设置等。</p>
     */
    @Column(name = "action_config", columnDefinition = "TEXT")
    private String actionConfig;

    /**
     * 通知配置
     *
     * <p>JSON格式的步骤通知配置。
     * 包含步骤开始、完成、超时等事件的通知设置。</p>
     */
    @Column(name = "notification_config", columnDefinition = "TEXT")
    private String notificationConfig;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 常量定义 =====

    // 步骤类型常量
    /** 步骤类型 - 初审 */
    public static final String TYPE_INITIAL = "INITIAL";

    /** 步骤类型 - 复审 */
    public static final String TYPE_REVIEW = "REVIEW";

    /** 步骤类型 - 终审 */
    public static final String TYPE_FINAL = "FINAL";

    /** 步骤类型 - 验证 */
    public static final String TYPE_VALIDATION = "VALIDATION";

    /** 步骤类型 - 批准 */
    public static final String TYPE_APPROVAL = "APPROVAL";

    /** 步骤类型 - 签名 */
    public static final String TYPE_SIGNATURE = "SIGNATURE";

    // 步骤规则常量
    /** 步骤规则 - 全部通过 */
    public static final String RULE_ALL_PASS = "ALL_PASS";

    /** 步骤规则 - 任一通过 */
    public static final String RULE_ANY_PASS = "ANY_PASS";

    /** 步骤规则 - 多数通过 */
    public static final String RULE_MAJORITY_PASS = "MAJORITY_PASS";

    /** 步骤规则 - 指定通过 */
    public static final String RULE_SPECIFIC_PASS = "SPECIFIC_PASS";

    // 默认超时时间常量（分钟）
    /** 默认超时时间 - 24小时 */
    public static final Integer DEFAULT_TIMEOUT_MINUTES = 1440;

    /** 快速审核超时时间 - 2小时 */
    public static final Integer FAST_AUDIT_TIMEOUT_MINUTES = 120;

    /** 紧急审核超时时间 - 30分钟 */
    public static final Integer URGENT_AUDIT_TIMEOUT_MINUTES = 30;

}